From b011a5bf41e3101a9f2108e6f25281f9279d9628 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 1 Feb 2016 13:53:16 +0100 Subject: [PATCH] x86: adjust xsave structure attributes The packed attribute was pointlessly used here - there are no misaligned fields, and hence even if the attribute took effect, it would at best lead to the compiler generating worse code. At the same time specify the required alignment of the fpu_sse sub- structure, such that the various typeof() uses on that field obtain pointers to properly aligned memory (knowledge which a compiler may want to make use of). Also add suitable build-time checks. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/i387.c | 4 +++- xen/arch/x86/xstate.c | 3 ++- xen/include/asm-x86/xstate.h | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c index 331a401d01..67016c95eb 100644 --- a/xen/arch/x86/i387.c +++ b/xen/arch/x86/i387.c @@ -277,7 +277,9 @@ int vcpu_init_fpu(struct vcpu *v) } else { - v->arch.fpu_ctxt = _xzalloc(sizeof(v->arch.xsave_area->fpu_sse), 16); + BUILD_BUG_ON(__alignof(v->arch.xsave_area->fpu_sse) < 16); + v->arch.fpu_ctxt = _xzalloc(sizeof(v->arch.xsave_area->fpu_sse), + __alignof(v->arch.xsave_area->fpu_sse)); if ( v->arch.fpu_ctxt ) { typeof(v->arch.xsave_area->fpu_sse) *fpu_sse = v->arch.fpu_ctxt; diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c index 4e87ab3387..f5d62feefc 100644 --- a/xen/arch/x86/xstate.c +++ b/xen/arch/x86/xstate.c @@ -414,7 +414,8 @@ int xstate_alloc_save_area(struct vcpu *v) BUG_ON(xsave_cntxt_size < XSTATE_AREA_MIN_SIZE); /* XSAVE/XRSTOR requires the save area be 64-byte-boundary aligned. */ - save_area = _xzalloc(xsave_cntxt_size, 64); + BUILD_BUG_ON(__alignof(*save_area) < 64); + save_area = _xzalloc(xsave_cntxt_size, __alignof(*save_area)); if ( save_area == NULL ) return -ENOMEM; diff --git a/xen/include/asm-x86/xstate.h b/xen/include/asm-x86/xstate.h index 12d939bd24..c902bb1c4c 100644 --- a/xen/include/asm-x86/xstate.h +++ b/xen/include/asm-x86/xstate.h @@ -48,9 +48,9 @@ extern u64 xfeature_mask; extern unsigned int *xstate_sizes; /* extended state save area */ -struct __packed __attribute__((aligned (64))) xsave_struct +struct __attribute__((aligned (64))) xsave_struct { - union { /* FPU/MMX, SSE */ + union __attribute__((aligned(16))) { /* FPU/MMX, SSE */ char x[512]; struct { uint16_t fcw; -- 2.30.2